<?php
/**
 * Created by PhpStorm.
 * User: hexvliang
 * Date: 2015/11/5
 * Time: 11:28
 */

namespace Common\Common;
use Common\Model\TimingEventsModel;
use Think\Cache\Driver\Redis;


/**
 * 定时事件公共方法
 * Class timingEvents
 * @package Common\Common
 */
class timingEvents
{
    /**
     * 给系统添加定时事件
     * @param string $name 事件的名字
     * @param string $functionUrl 事件的调用接口带http的绝对路径
     * @param int $beginSecond 单位是秒。多少秒后执行
     * @param array|null $parameters 请求接口的时候用的参数比如array('id'=>1,'name'=>"dsds")采用键值对的形势
     * @param bool|false $isCycle 是否是周期执行。
     * @param int $cycleSecond 单位是秒 如果是周期函数就是多少秒执行一次（但是开始执行的时间会以$beginSecond为准。然后才按照周期时间执行）
     * @return bool
     */
    public static function addEvent($name,$functionUrl,$beginSecond,$parameters=null,$isCycle=false,$cycleSecond=0)
    {
        $item=TimingEventsModel::getEventByName(trim($name));
        //如果不为空
        if(!empty($item)){
            return false;
        }

        if(empty($name) || empty($functionUrl) || empty($beginSecond) || !is_numeric($beginSecond)){
            return false;
        }

        $addResult=TimingEventsModel::addEvent($name,$functionUrl,$parameters,$isCycle,$cycleSecond);
        if($addResult){
            $options=array(
                'host'=>C("event_redis_ip")?:'127.0.0.1',
                'port'=>C("event_redis_port")?:6379,
            );
            $redisServer=new Redis($options);
            $redisServer->select(C('event_redis_index'));
            return $redisServer->set($addResult,$name,(int)$beginSecond);
        }else{
            return false;
        }
    }



    /**
     * 删除事件
     * @param string $name 按照事件的名字删除事件
     * @return bool
     */
    public static function deleteEvent($name)
    {
        $item=TimingEventsModel::getEventByName(trim($name));
        //如果为空
        if(empty($item)){
            return false;
        }
        $result1=TimingEventsModel::deleteEventByName($name);
        $id=$item['id'];
        $redisServer=new \Redis();
        $redisServer->connect(C('event_redis_ip'),C('event_redis_port'));
        $redisServer->select(C('event_redis_index'));
        $result2=$redisServer->delete($id);

        if($result1 && $result2){
            return true;
        }else{

            if($result1===false){
                getSentry::sentryMessage("从数据库中删除事件".$name.'失败');
            }
            if($result2===false){
                getSentry::sentryMessage("从redis中删除事件".$name.'失败');
            }
            return false;
        }
    }


}